package modelo.Escenografia;

import java.util.ArrayList;
import modelo.Orientacion.Posicion;
import modelo.controlAereo.Aeronave;
import java.util.Iterator;

public class Escenario{

	private ArrayList<Pista> pistas;
	private int extremoSuperior;
	private int extremoDerecho;

        /*	Pre: Se considera a los limites inferior e izquierdo, establecidos en 0.
	 * 		Se deben pasar los limites superior y derecho del Escenario. En caso de pasar números negativos,
	 * 		se toman los valores absolutos. Si alguno de los limites es 0, se establecen en 100.
	 *	Post: Se instancia un Escenario en un estado valido. Tambien se inicializa la Lista de Pistas.
	 */
	
	public Escenario(int extSup, int extDer) {
		if (extSup == 0) { extSup = 100;}
		if (extDer == 0) { extDer = 100;}
		extremoSuperior = extSup;
		extremoDerecho = extDer;
		pistas = new ArrayList<Pista>();
	}

        public int devolverExtremoSuperior(){
        /*PreCondicion: el escenario debe esta r creado
          PostCondicion: devuelve el valor del extremo superior*/
            return extremoSuperior;
        }

        public int devolverExtremoDerecho(){
        /*PreCondicion: el escenario debe estar creado
          PostCondicion: devuelve el valor del extremo derecho*/
            return extremoDerecho;
        }

	/*	Pre: -.
	 * 	Post: Se devuelve la lista de Pista que contiene el Escenario.
	 */
	public ArrayList<Pista> obtenerPistas() {
		return pistas;
	}

	/*	Pre: Se debe pasar una Pista o subclase de ella.
	 *	Post: Se agrega la Pista a la Lista de Pistas del Escenario.
	 */
	public void agregarPistas(Pista unaPista) {
		pistas.add(unaPista);
	}

	/*	Pre: Se debe pasar una objeto Posicion.
	 * 	Post: Devuelve si la posicion está dentro del Escenario.
	 * 	ACLARACIÓN: Si se encontrase justo en el límite, se considera que está fuera,
	 * 				es decir, devolverá FALSE.
	 */
	public boolean verificarPosicion(Posicion unaPosicion) {
		boolean resultado;
		resultado = ( (unaPosicion.devolverElValorDelEjeY() >= 0) &&
					(unaPosicion.devolverElValorDelEjeY() <= extremoDerecho) &&
					(unaPosicion.devolverElValorDelEjeX() >= 0) &&
					(unaPosicion.devolverElValorDelEjeX() <= extremoSuperior) );
		return resultado;
	}

        public boolean enAlgunaPistaSePuedeAterrizar(Aeronave aeronave){
        /*PreCondicion: el escenario debe estar creado
          PostCondicion: devuelve true si la aeronave puede aterrizar en alguna de las pistas del escenario,
          en caso contrario devuelve false*/
            Pista pista;
            boolean seguirBuscando = true;
            Iterator<Pista> iteradorPista = pistas.iterator();
            while (iteradorPista.hasNext() && seguirBuscando){
                pista = iteradorPista.next();
                if (aeronave.puedeAterrizarEn(pista)){
                    seguirBuscando = false;
                }
            }
            return !seguirBuscando;
        }

}
